package code

import "fmt"

// 接口嵌套
type Sayer interface {
	Say()
}

type Animal interface {
	Sayer
	Move()
	Jump()
}

func ReferenceInterface1() {
	var animal Animal
	// 没有初始化直接使用会报错
	// animal.Say()

	// 会打印nil, 接口零值为nil
	// 使用接口必须初始化
	fmt.Printf("animal: %v\n", animal)

}

// 实现, 必须实现所有方法
type Cat struct {
}

func (c *Cat) Say() {
	fmt.Println("喵喵喵")
}

type Dog struct {
}

func (d *Dog) Say() {
	fmt.Println("汪汪汪")
}

func (d *Dog) Move() {
	fmt.Println("狗在跑")
}

func (d *Dog) Jump() {
	fmt.Println("狗在跳")
}

type Fighter interface {
	Hurt()
}

func (d *Dog) Hurt() {
	fmt.Println("狗受伤了")
}

func ReferenceInterface2() {
	// 会报错, 提示没有实现接口所有方法
	// var animal0 Animal = &Cat{}
	var animal Animal = &Dog{}
	animal.Say()
	animal.Move()
	animal.Jump()

	var fighter Fighter = &Dog{}
	fighter.Hurt()
}
